package cn.iocoder.yudao.module.system.dal.mysql.oauth2;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.token.Oauth2AccessTokenPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.Oauth2AccessTokenDO;
import org.apache.ibatis.annotations.Mapper;

import java.time.LocalDateTime;
import java.util.List;

/**
 * oauth2访问令牌映射器
 *
 * @author huangweidong
 * @date 2023/05/10
 */
@Mapper
public interface Oauth2AccessTokenMapper extends BaseMapperX<Oauth2AccessTokenDO> {

    /**
     * 查询通过访问令牌
     *
     * @param accessToken 访问令牌
     * @return {@code Oauth2AccessTokenDO}
     */
    default Oauth2AccessTokenDO selectByAccessToken(String accessToken) {
        return selectOne(Oauth2AccessTokenDO::getAccessToken, accessToken);
    }

    /**
     * 查询列表通过刷新令牌
     *
     * @param refreshToken 刷新令牌
     * @return {@code List<Oauth2AccessTokenDO>}
     */
    default List<Oauth2AccessTokenDO> selectListByRefreshToken(String refreshToken) {
        return selectList(Oauth2AccessTokenDO::getRefreshToken, refreshToken);
    }

    /**
     * 查询分页
     *
     * @param reqVO 请求VO
     * @return {@code PageResult<Oauth2AccessTokenDO>}
     */
    default PageResult<Oauth2AccessTokenDO> selectPage(Oauth2AccessTokenPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<Oauth2AccessTokenDO>()
                .eqIfPresent(Oauth2AccessTokenDO::getUserId, reqVO.getUserId())
                .eqIfPresent(Oauth2AccessTokenDO::getUserType, reqVO.getUserType())
                .likeIfPresent(Oauth2AccessTokenDO::getClientId, reqVO.getClientId())
                .gt(Oauth2AccessTokenDO::getExpiresTime, LocalDateTime.now())
                .orderByDesc(Oauth2AccessTokenDO::getId));
    }

}
